#!/usr/bin/env python
# coding: utf-8

# 1、数据加载， pd.read_excel('./18级高一体测成绩汇总.xls')默认加载第一个工作表

# In[5]:


import numpy as np
import pandas as pd 


# In[6]:


boy = pd.read_excel('./18级高一体测成绩汇总.xls')
boy


# 2、数据加载， pd.read_excel('./18级高一体测成绩汇总.xls',sheet_name = 1)指定加载第二个工作表

# In[7]:


girl = pd.read_excel('./18级高一体测成绩汇总.xls',sheet_name= 1)
girl


# 3、评分标准加载，pd.read_excel('./体侧成绩评分表.xls',header = [0,1])，header=[0,1]表示多层列索引

# In[8]:


std = pd.read_excel('./体侧成绩评分表.xls',header = [0,1])
std


# 4、数据类型转换
# 
#  男1000米跑，数据类型是str，并且是4’26这种形式，需要变成float类型的值

# In[9]:


boy['男1000米跑'] = boy['男1000米跑'].str.replace("'" , ".")
boy['男1000米跑'] = boy['男1000米跑'].astype(float)
boy


# 评分标准中男1000米跑和女800米跑的成绩都是4‘10’‘这种形式，需要转化为float类型值

# In[10]:


std = std.replace("'",".",regex= True)
std = std.replace('"',"",regex=True)


# In[11]:


std = std.astype(float)
std


# 其他所有数值类型的值，都要转换为float类型的值

# In[12]:


display(boy.dtypes,girl.dtypes,std.dtypes)


# In[14]:


boy[['男体前屈','男引体','男肺活量','BMI']]= boy[['男体前屈','男引体','男肺活量','BMI']].astype(float)
girl[['女体前屈','女仰卧','女肺活量','BMI']] = girl[['女体前屈','女仰卧','女肺活量','BMI']].astype(float)
display(boy.dtypes,girl.dtypes,std.dtypes)


# 5、对体测成绩进行分数转换，跑步类（越小越好）；跳远、体前屈（越大越好）
# 
#  使用map、apply、transform方法
# 
#  列索引重排

# In[27]:


#男生跑步类成绩
for col in ['男1000米跑','男50米跑']:
    s = std[col] 
    def con(x):
        for i in range(len(s)): 
            if x <= s['成绩'].iloc[0]:
                if x == 0:  
                    return 0
                return 100
            elif x > s['成绩'].iloc[-1]:
                return 0 
            elif (x > s['成绩'].iloc[i - 1]) and (x <= s['成绩'].iloc[i]):
                return s['分数'].iloc[i]
boy[col + '成绩'] = boy[col].map(con)
boy


# In[18]:



# 男生除跑步类外的成绩
for col in ['男跳远', '男体前屈', '男引体', '男肺活量']:
    s = std[col] 
    def con(x):
        for i in range(len(s)):
            if x >= s['成绩'].iloc[i]:
                return s['分数'].iloc[i]
        return 0
    boy[col + '成绩'] = boy[col].map(con)
col = ['班级','性别','男1000米跑','男50米跑','男50米跑成绩','男跳远','男跳远成绩','男体前屈','男体前屈成绩',
       '男引体','男引体成绩','男肺活量','男肺活量成绩','身高','体重','BMI',]
boy = boy[col]
boy


# In[22]:


#女生跑步类成绩
for col in ['女800米跑', '女50米跑']:
    s = std[col]
    def con(x):
        for i in range(len(s)):
            if x <= s['成绩'].iloc[0]:
                if x == 0:  
                    return 0
                return 100
            elif x > s['成绩'].iloc[-1]:
                return 0 
            elif (x > s['成绩'].iloc[i - 1]) and (x <= s['成绩'].iloc[i]):
                return s['分数'].iloc[i]
    girl[col + '成绩'] =girl[col].map(con)
girl


# In[24]:


# 女生除跑步类外的成绩
for col in ['女跳远', '女体前屈', '女仰卧', '女肺活量']:
    s = std[col] 
    def con(x):
        for i in range(len(s)):
            if x >= s['成绩'].iloc[i]:
                return s['分数'].iloc[i]
        return 0
    girl[col + '成绩'] = girl[col].map(con)
col = ['班级','性别','女800米跑','女800米跑成绩','女50米跑','女50米跑成绩','女跳远','女跳远成绩','女体前屈','女体前屈成绩',
       '女仰卧','女仰卧成绩','女肺活量','女肺活量成绩','身高','体重','BMI',]
girl = girl[col]
girl


# In[25]:


# 女生BMI 体质指数(BMI)=体重(kg)/身高 (m)^2
girl['BMI'] = (girl['体重']/(girl['身高']/100)**2).round(1)
girl


# In[26]:


# 男生BMI 体质指数(BMI)=体重(kg)/身高 (m)^2
boy['BMI'] = (boy['体重']/(boy['身高']/100)**2).round(1)
boy


# In[30]:


# 引用模块
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif']='Kaiti'
boy_da =pd.cut(boy['男1000米跑成绩'],bins=3) # 将男1000米跑成绩分成三份
data = boy_da.value_counts()# 统计每份数量
data
 
fig=plt.figure(figsize=(5,5), dpi=150) # 设置图⽚⼤⼩和分辨率
 
explode = (0, 0, 0.5)
# 绘制饼图：autopct显示百分⽐，这⾥保留⼀位⼩数；shadow控制是否显示阴影
plt.pie(data, # 数据
 explode=explode, # 偏移中⼼量
 labels=data.index, # 显示标签
 autopct='%0.2f%%', # 显示百分⽐
 pctdistance=0.75,
 shadow=True) # 阴影，3D效果
_ = plt.title('   男1000米跑成绩  ',backgroundcolor = '#c5b783', color = 'white') # 标题设置


# In[32]:


boy_da =pd.qcut(girl['女800米跑成绩'],q=4,labels=['差','中','良','优'])
data = boy_da.value_counts()
# counts 统计次数
 
plt.figure(figsize = (12,9))
bars = plt.bar(x=data.index, height=data,width = 0.4)
 
for i,bar in enumerate(bars):
    
    h = bar.get_height()
    w = bar.get_width()
    
    
    plt.text(x = bar.get_x() + w/2 ,
             y = h + 0.5,
             ha = 'center',
             s = data[i])
 
_ = plt.title('   女800米跑成绩   ',backgroundcolor = '#c5b783', color = 'white',pad = 20, fontsize = 40)


# In[33]:


boy_da =pd.qcut(girl['女跳远成绩'],q=4,labels=['差','中','良','优'])
data = boy_da.value_counts()
# count 统计次数 ；bins 范围 fig
 
plt.figure(figsize = (12,9))
bars = plt.bar(x=data.index, height=data,width = 0.4)
 
for i,bar in enumerate(bars):
    
    h = bar.get_height()
    w = bar.get_width()
    
    
    plt.text(x = bar.get_x() + w/2 ,
             y = h + 0.5,
             ha = 'center',
             s = data[i])
_ = plt.title('   女跳远成绩   ',backgroundcolor = '#c5b783', color = 'white',pad = 20, fontsize = 40)


# In[34]:


p1 = pd.cut(boy['BMI'],bins=[0,16.5,23.3,26.4,100],labels=['低体重','正常','超重','肥胖']) # 外圈  ，男生
data1 = p1.value_counts()
 
p2 = pd.cut(girl['BMI'],bins=[0,16.5,22.8,25.3,100],labels=['低体重','正常','超重','肥胖']) # 内圈  ， 女生
data2 = p2.value_counts()
 
plt.figure(figsize=(9,9))
 
plt.pie(data1,radius=1,
        autopct='%0.2f%%',
        pctdistance=0.85,
        labels = data1.index,
       wedgeprops={'linewidth':5, # 间隔的宽度
                  'width':0.3, # 饼图的宽度
                  'edgecolor':'white'},# 间隔的颜色
                   textprops = {'family':'Kaiti','fontsize':18})
_ = plt.pie(data2,radius=0.7,autopct='%0.2f%%',
            pctdistance=0.55,
           wedgeprops={'linewidth':5,# 间隔的宽度
                      'width':0.7, # 饼图的宽度
                      'edgecolor':'white'})#间隔的颜色
plt.rcParams['font.family'] = 'Kaiti' # 全局设置
plt.rcParams['font.size']=18
_ = plt.title('   男女生体重指数   ',backgroundcolor = '#c5b783', color = 'white',pad = 20, fontsize = 40)


# In[ ]:




